package com.yc.cloud.mapper;

import com.yc.cloud.entity.AlarmRecord;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 告警记录表 Mapper 接口
 * </p>
 *
 * @author kinggu
 * @since 2025-07-15
 */
@Mapper
public interface AlarmRecordMapper extends BaseMapper<AlarmRecord> {

    /**
     * 查询指定状态下的平均响应时间（秒）
     * @param statuses 状态列表
     * @return 平均响应时间
     */
    default Double selectAverageResponseTime(List<Byte> statuses) {
        QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<AlarmRecord>()
                .select("AVG(" + AlarmRecord.HandleDuration + ")")
                .in(AlarmRecord.Status, statuses)
                .isNotNull(AlarmRecord.HandleDuration);

        List<Object> result = this.selectObjs(queryWrapper);

        if (result.isEmpty() || result.get(0) == null) {
            return 0.0; // 如果没有记录或平均值为NULL，返回0.0
        }

        // AVG的结果通常是BigDecimal，需要转换为Double
        Object avgValue = result.get(0);
        if (avgValue instanceof Number) {
            return ((Number) avgValue).doubleValue();
        }

        return 0.0;
    }

    /**
     * 统计指定设备/摄像头在指定时间范围内的报警数量
     * @param deviceId 设备ID（可选）
     * @param cameraId 摄像头ID（可选）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 报警数量
     */
    default Long countByDeviceAndTimeRange(Long deviceId, Long cameraId, LocalDateTime startTime, LocalDateTime endTime) {
        QueryWrapper<AlarmRecord> queryWrapper = new QueryWrapper<>();
        
        // 添加设备ID条件
        if (deviceId != null) {
            queryWrapper.eq(AlarmRecord.DeviceId, deviceId);
        }
        
        // 添加摄像头ID条件
        if (cameraId != null) {
            queryWrapper.eq(AlarmRecord.CameraId, cameraId);
        }
        
        // 添加时间范围条件：报警时间在录像的开始和结束时间之间
        if (startTime != null) {
            queryWrapper.ge(AlarmRecord.AlarmTime, startTime);
        }
        if (endTime != null) {
            queryWrapper.le(AlarmRecord.AlarmTime, endTime);
        }
        
        // 排除已删除的记录
        queryWrapper.eq(AlarmRecord.Deleted, false);
        
        return this.selectCount(queryWrapper);
    }
}